package code.ws_common_scene.command
{
	use namespace je_command_callfn;
	
	/**
	 * 指令基类
	 * @author qiangchen
	 * 
	 */	
	public class Command implements ICommand
	{
		/** 指令是否结束 */
		private var _isOver:Boolean = false;
		/** 回调方法 */
		private var _callFn:Function=null;
		/** 是否在指令结束时调用回调方法 */
		private var _isCall:Boolean = false;
		/** 内部回调方法 */
		protected var _innerCallFn:Function=null;
		
		/**
		 * 构造函数 
		 * @param callFn 指令执行完毕后回调方法
		 * @param isCall 是否在指令结束时调用回调方法
		 */		
		public function Command( callFn:Function=null, isCall:Boolean=true )
		{
			_callFn = callFn;
			_isCall = isCall;
		}
		
		
		/**
		 * 执行指令
		 * 
		 */		
		public function execute():void{};
		
		
		/**
		 * 设置内部回调方法 （用于及时清除内存中command对象的引用对象）
		 * @param _innerCallFn
		 * @private
		 */		
		je_command_callfn function setInnerCallFn( innerCallFn:Function ):void
		{
			_innerCallFn = innerCallFn;
		}
		
		/**
		 * 运行内部方法 
		 * 
		 */		
		private function goInnerCallFn():void
		{
			if( _innerCallFn != null )
			{
				_innerCallFn.call( null );
				_innerCallFn = null;
			}
		}
		
		
		/**
		 * 指令是否结束 
		 * @return 
		 * 
		 */		
		public function isOver():Boolean
		{ 
			return _isOver; 
		}
		
		
		
		/**
		 * 指令结束 
		 * 
		 */		
		public function over():void
		{ 
			_isOver = true;
			
			if( !_isCall )
			{
				_callFn = null;
				goInnerCallFn();
				return;
			}
			
			if( _callFn != null )
			{
				_callFn.call( null );
				_callFn = null;
			}
			goInnerCallFn();
		}
		
		
		/**
		 * 释放指令 
		 * 
		 */		
		public function dispose():void
		{
			_isCall = false;
			_callFn = null;
			_innerCallFn = null;
			_isOver = true;
		}
	}
}